package com.syb.util;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.ScrollableResults;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

public class BaseDao  extends HibernateDaoSupport{
	
/*	@Autowired
	protected SessionFactory sessionFactory;*/
	 

	@Autowired
   public void setMySessionFactory(SessionFactory sessionFactory){  
        this.setSessionFactory(sessionFactory);  
    } 
	

	/**
     * <保存实体>
     * <完整保存实体>
     * @param Object 实体参数
     * @see 根据实体保存
     */
	 public void save(Object entity) {
	        getHibernateTemplate().save(entity);
	    }
	 
	 	/**
	     * <保存或者更新实体>
	     * @param entity 实体
	     * @see 保存更新
	     */
	    public void saveOrUpdate(Object entity) {
	    	getHibernateTemplate().saveOrUpdate(entity);
	    }
	 
	
	    /**
	     * <根据HQL得到记录数>
	     * @param hql HQL语句
	     * @param values 不定参数的Object数组
	     * @return 记录总数
	     * @see 
	     */
	    public Long countByHql(String hql, Object... values) {
	        Query query = this.getSessionFactory().getCurrentSession().createQuery(hql);
	        if(values != null){
	            for(int i = 0; i < values.length; i++) {
	                query.setParameter(i, values[i]);
	            }
	        }
	        return (Long) query.uniqueResult();
	    }
	    
	    
	    /**
	     * <HQL分页查询>
	     * @param hql HQL语句
	     * @param countHql 查询记录条数的HQL语句
	     * @param pageNo 下一页
	     * @param pageSize 一页总条数
	     * @param values 不定Object数组参数
	     * @return PageResults的封装类，里面包含了页码的信息以及查询的数据List集合
	     * @see 
	     */
	    public PageResults<Object> findPageByFetchedHql(String hql, String countHql,int pageNo, int pageSize, Object... values) {
	        PageResults<Object> retValue = new PageResults<Object>();
	        Query query = this.getSessionFactory().getCurrentSession().createQuery(hql);
	        if(values != null){
	            for(int i = 0; i < values.length; i++) {
	                query.setParameter(i, values[i]);
	            }
	        }
	        int currentPage = pageNo > 1 ? pageNo : 1;
	        retValue.setCurrentPage(currentPage);
	        retValue.setPageSize(pageSize);
	        if (countHql == null)
	        {
	            ScrollableResults results = query.scroll();
	            results.last();
	            retValue.setTotalCount(results.getRowNumber() + 1);// 设置总记录数
	        }
	        else
	        {
	            Long count = countByHql(countHql, values);
	            retValue.setTotalCount(count.intValue());
	        }
	        retValue.resetPageNo();
	        List<Object> itemList = query.setFirstResult((currentPage - 1) * pageSize).setMaxResults(pageSize).list();
	        if (itemList == null)
	        {
	            itemList = new ArrayList<Object>();
	        }
	        retValue.setResults(itemList);
	         
	        return retValue;
	    }
}
